// axios 二次封装
import axios, {
  type AxiosRequestConfig,
  AxiosResponse,
  AxiosError,
} from "axios";

export const httpInstance = axios.create();
declare module "axios" {
  export interface AxiosResponse<T = any> extends Promise<T> {}
}
import { ElMessageBox } from "element-plus";
import { useLocaleStore } from "@/store/locales";

const useLocale = useLocaleStore();
/*
 *根据环境变量区分接口的默认地址
 */
console.log(process.env.NODE_ENV);
switch (process.env.NODE_ENV) {
  case "production":
    httpInstance.defaults.baseURL = "http://rap2api.taobao.org/app/mock/316849";
    break;
  case "development":
    httpInstance.defaults.baseURL = "http://rap2api.taobao.org/app/mock/316849";
    break;
  default:
    httpInstance.defaults.baseURL = "http://rap2api.taobao.org/app/mock/316849";
    break;
}

/**
 * 设置超时时间和跨域时候是否允许携带凭证
 *
 */
httpInstance.defaults.timeout = 60000; //60S
httpInstance.defaults.withCredentials = true;

/**
 * 设置请求传递数据的格式 （看服务器要求上面格式，最常用格式） 设置登录的请求头
 * application/json
 */
httpInstance.defaults.headers["content-Type"] = "application/json";
//axios.defaults.headers['content-Type']='text/plain'
// axios.defaults.transformRequest=data=>{qs.stringify(data)};

// axios.defaults.headers["ec-token"] = auth_info.access_token;

// /*
/**设置请求拦截器
 *TOKEN校验（JWT） 接收服务器返回的token 存储到vuex/本地存储中（暂时没用）
 * 每一次向服务器发送请求，我们应该把token带上
 */
httpInstance.interceptors.request.use(
  (config: AxiosRequestConfig | any) => {
    config.headers["Lang"] = useLocale.locale;
    config.headers["User_id"] = useLocale.userid;
    let token = localStorage.getItem("token");
    if(token){
      config.headers['Token'] = token;
    }
    return config;
  },
  (error: AxiosError) => {
    return Promise.reject(error);
  }
);

// /**
//  * 响应拦截器
//  * 服务器返回信息  拦截 客户js获取
//  */

httpInstance.interceptors.response.use(
  (response: AxiosResponse) => {
    console.log("请求响应");
    //只有响应的主体内容
    return response.data;
  },
  (error) => {
    let { response } = error;

    if (response) {
      //服务器起码返回结果了

      switch (response.status) {
        case 401: //当前用户未登录 权限
          ElMessageBox.alert("ERROR", "提示", {
            confirmButtonText: "OK",
            type: "error",
          })
            .then((res) => {})
            .catch((err) => {});
          //登录
          break;
        case 402: //服务器已经理解请求，但是拒绝执行（一般是token过期）
          localStorage.removeItem("token");
          break;
        case 403:
          console.log("no user");
          break;
        case 404:
          break;
      }
    } else {
      //服务器没有返回结果
      //1.服务器蹦了
      //2.客户端断网
      if (!window.navigator.onLine) {
        //断网处理：可以跳转到断网页面
        return;
      }
      return Promise.reject(error);
    }
  }
);

export const $get = (url: string, params?: object) => {
  return httpInstance.get(url, { params });
};
export const $post = async (url: string, params?: object) => {
  return await httpInstance.post(url, params);
};
